使用Java 8 的 Optional 类进行优雅的判空
前言
这篇是身为技术菜鸟的博主写的第一篇技术文章,新手上路,文笔粗糙,还请大家多多担待。
之所以写这篇文章,起因是我看完《Java 8 in Action》 也有一段时间了,在日常工作中,也经常使用 Java 8 的语法,就打算写下有关 Java 8 的一系列文章,用于自我复习和总结,加深自己对 Java 8的理解和使用,好了,言归正传,下面就让我们进入主题吧。
你是否曾经被 NullPointerException 异常折磨的苦不堪言?你是否曾为复杂的POJO 类写非空判断,为那多个 if xxx != null 或多层嵌套 if xxx != null 的代码感到烦恼心累?
呐,程序猿们,我们是时候用Java 8 的 Optional 类进行优雅的判空啦,当然,如果你用的是 Java 8 的话(:з」∠)。
Optional 是什么?
java.util.Optional
Optional 的类方法
方法 | 描述 |
---|---|
static |
返回一个空的 Optional 实例 |
static |
返回一个包含指定 value 的 Optional,如果 value 为空,则抛出 NullPointerException |
static |
将指定的值用 Optional 封装之后返回,如果 value 为null,则返回一个空的 Optional 对象 |
T get() | 如果 Optional 包含有值,则返回该值,否则抛出 NoSuchElementException 异常 |
boolean isPresent() | 如果 Optional 有值,则返回 true,否则返回 false |
void ifPresent(Consumer<? super T> action) | 如果 Optional 有值,则使用该值调用 consumer,否则不做任何事情 |
Optional |
如果 Optional 有值,且该值与给定的 predicate 匹配,则返回 该 Optional,否则返回一个空的 Optional |
Optional map(Function<? super T, ? extends U> mapper) | 如果 Optional 有值存在,就对该值执行提供的mapping 函数调用 |
Optional flatMap(Function<? super T, ? extends Optional<? extends U>> mapper) | 如果 Optional 有值存在,就对该值执行提供的mapping 函数调用,返回一个Optional 类型的值,否则就返回一个空的Optional 对象 |
T orElse(T other) | 如果 Optional 有值,则将其返回,否则返回指定 other 值 |
T orElseGet(Supplier<? extends T> supplier) | 如果 Optional 有值则将其返回,否则返回一个由指定的Supplier 接口生成的值 |
T orElseThrow() | 如果 Optional 有值,则将其返回,否则抛出 NoSuchElementException 异常 |
如果 Optional 有值则将其返回,否则抛出一个由指定的 Supplier 接口生成的异常 | |
Stream |
如果 Optional 有值,则返回一个包含 Optional 的 Stream,否则返回一个空的 Stream |
Optional 的应用实例
上面基本上列出了 Optional 类的所有方法,下面挑几个常用的方法进行介绍:
1 | public class OptionalTest { |
使用 Optional 进行优雅判空
还是用上面列举的类,如果不用使用 Optional,想要获取 Basket 类内的 Apple 类的 weight 值,得这样写:
1 | public double getAppleWeight(Basket basket){ |
看看这个 if 嵌套,emm…,这还是较为简单的 pojo 类,如果是复杂的,简直不堪入目啊。
而在 Optional 的加持下,只需这样写:
1 | public double getAppleWeight(Basket basket){ |
瞬间代码就清爽了,嘻嘻,人也跟着欢快起来了。
当然 Optional 不止能进行优雅的判空,还可以利用 Optional 的其它的API,进行一些神奇的操作,比如使用 filter 进行参数校验之类的。
参考:
- 《Java 8 in Action》
- Java8 如何正确使用 Optional